package com.demo.sso.controller.sso;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

@RestController
@RequestMapping("/oauth2")
public class OAuth2Controller {

    // 模拟授权码存储
    private static final ConcurrentHashMap<String, String> CODE_MAP = new ConcurrentHashMap<>();


    /**
     * 授权页面
     */
    @GetMapping("/authorize")
    public void authorize(String clientId, String redirectUri, String responseType, String state, HttpServletResponse response) throws IOException {
        // 1. 验证客户端ID和重定向URI
        // 实际项目中应从数据库或配置中验证
        if (!"app1".equals(clientId) && !"app2".equals(clientId) && !"test-client-id".equals(clientId)) {
            response.sendError(400, "无效的客户端ID");
            return;
        }

        // 2. 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            // 未登录，重定向到登录页面
            response.sendRedirect("/auth/login");
            //TODO
            //response.sendRedirect("/auth/login?redirect=" + java.net.URLEncoder.encode("/oauth2/authorize?clientId=" + clientId + "&redirectUri=" + redirectUri + "&responseType=" + responseType + "&state=" + state, "UTF-8"));
            return; // 重要：返回以避免继续执行下面的代码
        }

        // 3. 已登录，生成授权码
        if ("code".equals(responseType)) {
            String code = UUID.randomUUID().toString().replace("-", "");
            CODE_MAP.put(code, StpUtil.getLoginIdAsString());

            // 4. 重定向到第三方应用的回调地址
            String redirectUrl = redirectUri + "?code=" + code;
            if (state != null) {
                redirectUrl += "&state=" + state;
            }
            response.sendRedirect(redirectUrl);
        } else {
            response.sendError(400, "不支持的响应类型");
        }
    }

    /**
     * 获取token接口
     */
    @GetMapping("/token")
    public SaResult token(String grantType, String code, String clientId, String clientSecret) {
        // 1. 验证授权类型
        if (!"authorization_code".equals(grantType)) {
            return SaResult.error("不支持的授权类型");
        }

        // 2. 验证客户端ID和密钥
        // 实际项目中应从数据库或配置中验证
        if (!"app1".equals(clientId) || !"secret1".equals(clientSecret)) {
            return SaResult.error("无效的客户端凭证");
        }

        // 3. 验证授权码
        String username = CODE_MAP.remove(code);
        if (username == null) {
            return SaResult.error("无效的授权码");
        }

        // 4. 生成token
        String token = UUID.randomUUID().toString().replace("-", "");
        // 实际项目中应存储token与用户的关联关系

        return SaResult.ok()
                .set("access_token", token)
                .set("token_type", "Bearer")
                .set("expires_in", 3600);
    }

    /**
     * 获取用户信息接口
     */
    @GetMapping("/userinfo")
    public SaResult userinfo(String accessToken) {
        // 1. 验证token
        // 实际项目中应验证token的有效性

        // 2. 获取用户信息
        // 实际项目中应根据token查询关联的用户信息
        String username = "admin"; // 示例值
        String nickname = "系统管理员"; // 示例值

        return SaResult.ok()
                .set("username", username)
                .set("nickname", nickname);
    }
}